<?php
/**
 * 通用打印类
 * User: allen_ios
 * Date: 17/4/29
 * Time: 下午3:41
 */
class DoPrint
{
    private static $_instance;      //对象实例
    private $_printParams;   //打印参数信息
    private $_printUrl;      //打印的服务地址

    /**
    * 单列模式下，将构造函数设置为私有，防止外部new
    */
    private function __construct($params)
    {
        $this->_printUrl = $params['url'] ? : C('wifiprint_url');
        $this->_printParams = array(
            'op' => $params['op'] ?  : 'pf',                //操作类型（pf:打印操作  cx：查询打印机状态 cxdd：查询订单状态）
            'key' => $params['key'] ? : C('wifiprint_key'), //加密字符串
            'unm' => $params['unm'] ? : C('wifiprint_unm'), //官网用户名
            'dno' => $params['dno'],                        //打印设备编号
            'content' => $params['content'],                //打印内容
            'mode' => $params['mode'] ? : 0,                //打印模式（0 混合打印;1文本打印; 2二维码打印;3条码打印）
            'msgno' => $params['msgno'] ? : '',             //打印订单编号（不传则自动生成）
            'qr' =>  $params['qr'] ? : '',                  //支付宝二维码图片链接地址（可选）
            'print_times' => $params['print_times'] ? : 1   //打印次数
        );
    }

    /**
     * 防止对象被克隆
     */
    public function __clone()
    {
        throwException('单列对象不能被克隆',100000);
    }

    /**
     * Singleton instance（获取自己的实例）
     * @param array $params 实例参数
     * @return 类实例对象
     */
    public static function getInstance($params)
    {
        if (!self::$_instance) {
            self::$_instance = new self($params);
        }

        return self::$_instance;
    }

    /**
     * 使用wifi打印
     * @param string $contentFooter   内容详情
     */
    public function useWifiPrint($contentFooter='')
    {
        /**
        返回状态码
        0 成功
        1 订单发送失败';
        200 查询失败';
        201 不存在当前设备';
        300 二维码打印成功';
        301 二维码打印失败';
        401 查询订单失败';
        900 没有相关操作';
        901 操作错误';
        -2 验证错误';
        -3 绑定设备不属于该用户';
        -4 打印类型错误';
        -5 该用户无效';
        -7 设备号';
        -8 参数错误';
        -102 条形码打印存在汉字';
        -103 组合打印类型不含有前缀';
         **/

        $result = array();

        $str = $this->_printParams['key'].$this->_printParams['dno'].'aykj';
        $key = md5($str);
        for($i = 0; $i < $this->_printParams['print_times']; $i ++)
        {
            $fields = array(
                'op' => $this->_printParams['op'],
                'content' => $this->_printParams['content'] . $contentFooter,
                'key' => $key,
                'unm' => $this->_printParams['unm'],
                'dno' => $this->_printParams['dno'],
                'mode' => '|' . $this->_printParams['mode'],
                'msgno' => $this->_printParams['msgno'],
            );

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $this->_printUrl);
            curl_setopt($ch, CURLOPT_POST,1); // 启用时会发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。
            curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); // 在HTTP中的“POST”操作。如果要传送一个文件，需要一个@开头的文件名

            //设置缓冲区
            ob_start();

            curl_exec($ch);
            $result[] = ob_get_contents();
            ob_end_clean();
        }
    }
}